package com.merry.jcip;

import java.util.EventListener;

/**
 * @author zouyb
 * 使用的this导致的引用逸出。
 */
public class ThisEscape {
    /**
     * this 引用逃逸的两种情况：
     *  1.在构造函数中启动一个线程：当对象在其构造函数中创建一个线程时，this引用都会被新建的线程共享，所以不要在构造函数中启动它。
     *  2.在构造函数中使用监听器。同样也会导致引用逸出。
     *  出现这种问题的原因在于，我们使用监听器或者启动一个线程，都是在构造函数中进行的，在这个函数中有可能当前对象还没有初始化好，但是监听器或者别的线程已经持有了这个对象的this引用，从而出现了引用逃逸。
     */

//    private final int var;
//    public ThisEscape(EventSource source){
//        source.registerListener(
//                new EventListener(){
//                    public void onEvent(Event e){
//                        doSomething(e);
//                    }
//                }
//        );
//
//        //初始化这个类
//        var = 10;
//    }
//
//    //在这个方法中可能返回0或者10.
//    private int doSomething(Event e) {
//        return var;
//    }

    /**
     * 解决this引用逸出问题：
     *  1.使用工厂方法解决this引用逸出的问题。
     *  也就是不要在构造方法中注册监听器，在下面的例子中，已经new好了ThisEscape对象之后在注册的构造器。
     */

//    private final EventListener listener;
//
//    private final int var;
//
//    private ThisEscape(){
//        listener = new EventListener() {
//            public void onEvent(Event e){
//                doSomething1(e);
//            }
//        };
//
//        var = 10;
//    }
//
//    public static ThisEscape newInstance(EventSource source){
//        ThisEscape thisEscape = new ThisEscape();
//        source.registerListener(thisEscape.listener);
//        return thisEscape;
//    }
//
//    //只会返回10.
//    private int doSomething1(Event e) {
//        return var;
//    }
}













































